package features.advance.leetcode.tree.easy;

import features.advance.leetcode.tree.model.TreeNode;
import features.advance.leetcode.util.TreeUtil;

/**
 *  剑指 Offer 28. 对称的二叉树
 *
 *  难度；简单
 *
 * 请实现一个函数，用来判断一棵二叉树是不是对称的。如果一棵二叉树和它的镜像一样，那么它是对称的。
 *
 * 例如，二叉树 [1,2,2,3,4,4,3] 是对称的。
 *
 *     1
 *    / \
 *   2   2
 *  / \ / \
 * 3  4 4  3
 * 但是下面这个 [1,2,2,null,3,null,3] 则不是镜像对称的:
 *
 *     1
 *    / \
 *   2   2
 *    \   \
 *    3    3
 *
 *
 *
 * 示例 1：
 *
 * 输入：root = [1,2,2,3,4,4,3]
 * 输出：true
 * 示例 2：
 *
 * 输入：root = [1,2,2,null,3,null,3]
 * 输出：false
 *
 *
 * 限制：
 *
 * 0 <= 节点个数 <= 1000
 *
 * 注意：本题与主站 101 题相同：https://leetcode-cn.com/problems/symmetric-tree/
 *
 * @author LIN
 * @date 2021-06-07
 */
public class Offer28 {

    public static void main(String[] args) {
        String str = "[1,2,2,3,4,4,3]";
//        str = "[1,2,2,null,3,null,3]";
        str = "[1,0]";
        TreeNode root = TreeUtil.stringToTreeNode(str);

        Solution solution = new Solution() {
        };
        boolean symmetric = solution.isSymmetric(root);
        System.out.println(symmetric);
    }

    static class Solution{

        public boolean isSymmetric(TreeNode root) {
            if(root != null){
                return (root.left ==null && root.right == null) || root.left != null && root.right != null
                        && root.left.val == root.right.val
                        && isSymmetric(root.left,root.right);
            }
            return true;
        }
        public boolean isSymmetric(TreeNode left, TreeNode right){
            if(left != null && right != null){
                return isSymmetric(left.left,right.right)
                        && isSymmetric(left.right,right.left)
                        && left.val == right.val;
            }
            return left ==null && right == null;
        }
    }
}
